package com.gdust.gkyx.home.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ClassName: ThreadPoolConfig
 * Package: com.gdust.gkyx.home.config
 * Description:线程池配置类：ThreadPoolConfig
 *
 * 用于定义线程池的配置，提供一个可供全局使用的线程池实例。
 * // ThreadPoolExecutor自带的拒绝策略如下：
 * //   1. AbortPolicy(默认)：直接抛出RejectedExecutionException异常阻止系统正常运行
 * //   2. CallerRunsPolicy：“调用者运行”一种调节机制，该策略既不会抛弃任务，也不会抛出异常，而是将某些任务回退到调用者，从而降低新任务的流量。
 * //   3. DiscardOldestPolicy：抛弃队列中等待最久的任务，然后把当前任务加人队列中 尝试再次提交当前任务。
 * //   4. DiscardPolicy：该策略默默地丢弃无法处理的任务，不予任何处理也不抛出异常。 如果允许任务丢失，这是最好的一种策略。
 *
 *
 * @Author syun
 * @Create 2025/1/28 9:12
 * @Version 1.0
 */
@Configuration
public class ThreadPoolConfig {

    /**
     * 定义线程池的Bean
     *
     * @return ThreadPoolExecutor 实例化的线程池
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                2,// 核心线程数：线程池中始终保留的线程数量，用于处理任务
                5,// 最大线程数：线程池允许的最大线程数量
                2,// 空闲线程的存活时间：非核心线程空闲超过指定时间会被回收
                TimeUnit.SECONDS,// 存活时间的单位：秒
                new ArrayBlockingQueue<>(3),// 阻塞队列：用于存储等待执行的任务，队列长度为3
                Executors.defaultThreadFactory(),// 线程工厂：用于创建线程的工厂，采用默认实现
                new ThreadPoolExecutor.AbortPolicy()// 拒绝策略：当任务无法提交到线程池时抛出异常
        );
        return executor;
    }
}
